#include "matrizabstracta.h"
#include <cassert>
#include <iomanip>

/*
 * set
 */
void MatrizAbstracta::set(Indice i, Indice j, double valor) {
}

/*
 * operator()
 */
double MatrizAbstracta::operator()(Indice i, Indice j) const {
	return get(i, j);
}

/*
 * sumaMultiplo
 */
void MatrizAbstracta::sumaMultiplo(
	Indice filaOrigen,
	Indice filaDestino,
	double factor, 
	Indice columnaDesde,
	Indice columnaHasta
) {
	assert(1 <= columnaDesde && columnaHasta <= cantidadDeColumnas());
	//MatrizAbstracta& t = *this;
	for (Indice j = columnaDesde; j <= columnaHasta; j++) {
		set(filaDestino, j, get(filaDestino, j) + factor * get(filaOrigen, j) );
	}
}

/*
 * sumaMultiplo
 */
void MatrizAbstracta::sumaMultiplo(
	Indice filaOrigen,
	Indice filaDestino,
	double factor
) {
	sumaMultiplo(filaOrigen, filaDestino, factor, 1, cantidadDeColumnas());
}

/*
 * serializate
 */

ostream& MatrizAbstracta::serializate(ostream& o, bool conFormatoMatlab) const {
	const MatrizAbstracta& m = *this;

	if (conFormatoMatlab) {
		o << " [ ";
	}

	for (Uint i = 1; i <= m.cantidadDeFilas(); i++) {
		for (Uint j = 1; j <= m.cantidadDeColumnas(); j++) {
			o << m(i, j) << " ";
		}
		o << (conFormatoMatlab ? ";" : "") << endl;
	}
	return o << (conFormatoMatlab ? " ];": "");
}
/*
 * operator<<
 */
ostream& operator<<(ostream& o, const MatrizAbstracta& m) {
	return m.serializate(o);
}
